emacs

Die Übersichtlichkeit der Seite wird durch Javascript erhöht. Ist dies aktiviert, werden die Texte unter den Überschriften durch Anklicken der Überschriften ein- und ausgeblendet.

Vorwort

Dieses Programm begeistert mich, je mehr ich es kennenlerne. Die Dokumentationen dazu, die ich bislang gefunden habe, sind allesamt gut, aber jeweils sehr lückenhaft. Daher habe ich vieles in Unterschiedlichsten Tutorials gelernt. Alles für mich wesentliche möchte ich hier zusammentragen.

nach oben

Bedienung

emacs allgemein

C-x C-c --> Emacs beenden

Die Tastenfolge Strg+x Strg+c beendet den Emacs. Dabei wird für alle geöffneten Buffer, die geändert wurden gefragt, ob Sie in der dazugehörigen Datei gespeichert werden sollen.

nach oben

C-g --> Befehl abbrechen

Wenn man eine falsche Tastenkombination gedrückt hat oder aus andern Gründen den gerade aufgerufenen Befehl abbrechen möchte braucht man nur <STRG>+g drücken.

nach oben

C-h b --> Liste alle Tastaturkomanndos auf

Mit STRG+h b ist es möglich sich die aktuell unter dem Modus geltenden Tastaturkomandos auflisten zu lassen.

nach oben

C-x C-+ --> Schriftgröße anpassen

Mit ><STRG>+x <STRG>+[+;-]< kann die Schriftgröße im aktuellen Buffer flexibel angepasst werden. Solange keine andere Aktion ausgeführt wird, genügt das wiederholte drücken von Plus oder Minus um die Schrift zu vergrößern bzw. zu verkleinern.

nach oben

C-x C-q --> Wechsel zwischen read-only und Änderungsmodus

Möchte man ein versehentliches Ändern eines Dokumentes verhindern ist es über diese Tastenkombination möglich die Funktion toggle-read-only aufzurufen. Möchte man dann doch Änderungen durchführen, wiederholt man den Befehl einfach.

nach oben

Directory-Modus

aufrufen

C-x d
ruft den Verzeichnismodus auf
C-x C-f ENTER
Datei finden, durch ENTER wird ebenfalls in den

Verzeichnismodus gewechselt

C-x r b
Aufrufen eines Bookmarks - dies kann ebenfalls ein

Verzeichnis sein

nach oben

schließen

Einfach auf q drücken

nach oben

markieren

d
Datei zum löschen markieren
u
Löschmarkierung wieder entfernen
<del>
Eine Zeile hoch gehen und die Löschmarkierung entfernen
~
markieren aller ~-Dateien (Backup-Dateien)
#
markieren aller #-Dateien (Automatisch gespeicherte Dateien)
.
markiert alle Backup-Dateien, mit ausnahme der neusten und der

ältesten einer Datei

%d expression
Markiert alle Dateien, die die Expression im Namen

enthalten.

* m
markiere die Datei unter dem Cursor
* *
markiere / demarkiere alle ausführbaren Dateien
* @
markiere alle symbolischen Links
* /
markiere alle Verzeichnisse
* s
markiere alle Dateien
* u
entferne die Markierung in der aktuellen Zeile
* !
entferne alle Markierungen
<SCHIFT>-u
wie * !
* C-n
gehe zur nächsten Markierung
* C-p
gehe zur vorhergehenden Markierung
* t
wechsle die Markierung (markiert unmarkierte und umgekehrt)
* % expression
Markiert alle Dateien, die die Expression im Namen

enthalten

nach oben

anzeigen

f
öffnet die Datei unter dem Cursor im selben Fenster
<RET>
alternatif zu f
e
alternativ zu f
o
öffnet die datei unter dem Cursor in einem anderen Fenster
v
Datei nur zum lesen öffnen
^
wechsle in das Überverzeichnes
i
wechsle in das gewählte Unterverzeichnis
C-M-n
gehe zum nächsten Unterverzeichnis
C-M-P
gehe zum vorherigen Unterverzeicchnis
C-M-u
gehe zum Überverzeichnis
$
zeige ein Unterverzeichnis an und blende es wieder aus
M-$
Blende alle eingeblendten Unterverzeichniss wieder aus
g
aktualisiere die Verzeichnisansicht
s
Wechsle zwischen alphabetischer und zeitlicher Sortierung

nach oben

löschen

x
löschen der markierten Dateien

Statt einer Datei kann auf diese Weise auch ein leeres Verzeichnis gelöscht werden.

D
löscht die markierten Dateien

nach oben

Dateimanipulation

c new <RET>
Kopiert die Datei unter dem Cursor nach new ( new

kann auch einfach der neue Name der Datei sein)

R new <RET>
wie das Shellkomanndo mv
  • bei einer einzelnen Datei wird die Datei in new umbenannt
  • bei mehreren Dateien werden diese in das Verzeichnis new verschoben
H new <RET>
erstellt einen Hardlink
S new <RET>
erstellt einen Softlink
M modspec <RET>
Ändern der Berechtigungsbits (chmode)
G newgroup <RET>
Markierte Dateien eine neue Gruppe zuordnen
O newowner <RET>
Markierten Dateien einen neuen Besitzer zuweisen
Z
packen / entpacken der Markierten Dateien
% u
Namen der markierten Dateien auf Großbuchstaben ändern
% l
Namen der markierten Dateien auf Kleinbuchstaben ändern
+
neues Verzeichnis anlegen
w
Markierte Dateien ausschneiden

nach oben

Hilfe

c-h v
beschreibe eine Variable
c-h f
beschreibe eine Funktion
c-h k
beschreibe eine Tastenkombination

Info-Dateien

Auch sonst ist emacs sehr gut dokummentiert. Diese Dokumentation wird im emacs in sogenannte Info Dokumentationen organisiert. Eine Übersicht kann mann über C-h i aufrufen. Innerhalb dieser Dokumentation kann mann sehr leicht navigieren. Wie das geht steht ebenfalls in einem Info Dokument.

Navigation innerhalb eines Infodokumentes

eigene Info Dokumente

Ordner anlegen und bekannt machen:

Um eigene Dokumente einzubinden habe ich einen Ordner Pfad:~/.emacs/info angelegt, in den ich alle .info-Dateien hineinkopiere. Dann folgenden Eintrag in der .emacs-Datei hinzufügen, damit emacs den Pfad zu meinen Info-Dateien kennt:

; Einstellung für das Einbinden eigener Infodokumente
; im Verzeichnis ~/.emacs.d/info/
(setq Info-default-directory-list
      (append '("~/.emacs.d/info/") Info-default-directory-list))

nach oben

dir-Datei

Damit die Infodateien dann im Info-Dir angezeigt werden habe ich im selben Verzeichnis eine Datei namens dir angelegt: Hinweis: statt _* muss * geschrieben werden


persöhnliche Info-DIR Datei im Verzeichnis ~/.emacs.d/info/
^_ <-- ein Sonderzeichen, das von der orginalen Datei kopiert werden muss
File: dir,	Node: Top	Dies ist der Beginn des INFO-Baums

  Dieser Verzeichnis-Knoten zeigt ein Menü aller Hauptpunkte an.
  „q“ beendet Info, „?“ listet alle Info-Befehle auf, „d“ kehrt hierher
  zurück, „h“ gibt eine Einsteiger-Hilfe, „mEmacs<Return>“ besucht das
  Emacs-Manual, etc.

  Im Emacs kann man mit dem zweiten Mausknopf auf einen Menüeintrag oder
  einen Querverweis klicken, um einen solchen auswählen.

_* Menu:

Emacs
_* Emacs: (emacs). Info zu Emacs (C-h r)
_* Info: (info). Einführung in die Nutzung der Info-Dateien
_* GNU Texinfo 5.2: (texinfo). Referenz zu texInfo
_* LispIntroduction: (~/.emacs.d/info/eintr.info). Einführung in EmacsLisp
_* Elisp-Reference: (elisp). Emacs Lisp Referenz

nach oben

Fenster anpassen

C-z --> pausieren

Mit der Tastenkombination <STRG>+z ist es möglich den emacs zu pausieren. Dabei wird dieser in einer grafischen Oberfläche minimiert. Im Terminal wird der emacs dann komplett in den Hintergrund verschoben. Durch die Eingabe des Befehls 'fg' oder '%emacs' kann der Emacs dann wieder in den Vordergrund geholt werden. Er ist dann im selben Zustand, indem man ihn zuvor beim drücken von <STRG>+z verlassen hatte.

nach oben

Konfiguration

.emacs zur Laufzeit neu einlesen

M-x eval-buffer in der .emacs Datei lässt diese neu laden.

nach oben

Blinkenden Cursor im XEmac abschalten

Der Cursor kann nur in der X-Anwendung direkt von emacs beinflusst werden. Dazu einfach folgende Zeile in die .emacs schreiben:

  • (blink-cursor-mode (- (*) (*) (*)))

nach oben

Menübar ausschalten

Die Menübar nimmt eigentlich nur Platz auf dem Bildschirm weg. Im Terminal ist das Menü ohnehin nur über <F10>-Taste zu erreichen. Um sie permanent zu entfernen ist folgende Zeile in die Datei .emacs zu schreiben:

  • (menu-bar-mode -1)

Will man unter X die Menu-Bar wieder anschalten nutzt man die Tastenkombination: M-x menu-bar-mode

nach oben

Variabeln

Über Variabeln können spezielle Verhaltensweisen festgelegt werden.

M-x set-variabel
Variabeln setzen

nach oben

Navigation

Manipulation

Löschen

  • C-d --> lösche ein Zeichen unter dem Cursor
  • <Delete> --> lösche ein Zeichen vor dem Cursor
  • M-<Delete--> lösche bis zum nächsten Wortanfang
  • M-d --> lösche bis zum Wortende
  • C-k --> lösche bis zum Ende der Zeile
  • M-k --> lösche bis zum nächsten Satzende

nach oben

Eingabe

Text kann im Emacs einfach eingegeben werden. Es gibt hierfür keine besonderen Modis.

C-u N Z --> N Wiederholungen von Z

Nach <STRG>+u kann man eine Zahl eingeben, die angibt wie oft die darauf folgende Eingabe wiederholt wird. So kann man zum Beispiel durch ~<STRG>+u 5 *~ 5 Sterne eingeben.

M-x auto-fill-mode --> Automatischer Zeilenumbruch

Dadurch wird der Auto-Fill-Mode an und ausgeschaltet. Dieser bewirkt, dass nach einer bestimmten Anzahl Zeichen (Standard 70) die Zeile umgebrochen, also die Eingabe automatisch in der folgenden Zeile fortgesetzt wird. Dies ist generell sehr praktisch.

M-q --> Text formatieren

Wenn der auto-fill-Modus nachträglich aktiviert wird oder die Zeichenzahl pro Zeile nachträglich geändert wird, kann man den Text durch die Tastenkombination <ALT>+q entsprechend umformatieren.

nach oben

C-x f N --> Festlegen der Zeilenlänge N für den auto-fill-mode

Mit ><STRG>+x f Anzahl Zeichen< kann man die Anzahl der Zeichen nach der eine Zeile umgebrochen werden soll festlegen. Dies wird dann bei der eingabe berücksichtigt, sofern der auto-fill-mode angeschaltet ist.

nach oben

Textformatierung

Text --> fett

Text zwischen 2 Sternchen wird fett dargestellet.

nach oben

/Text/ --> Kursiv

Text zwischen zwei Slahes wird /kursiv/ dargestellt. Für die Nutzung mit meinem HTML-Parser muss ich die Slashes durch jeweils 2 Backslash ersetzen: kursiv.

nach oben

Text --> unterstrichen

Text zwischen zwei Unterstrichen wird unterstrichen

nach oben

Code --> Codeformatiertung

Text zwischen zwei Gleichheitszeichen wird als Code dargestellt

nach oben

Durchgestrichen

Text zwischen 2 Pluszeichen wurd durchgestrichen dargestellt

nach oben

M-o M-s --> Zeile Zentrieren

nach oben

Ausschneiden / Kopieren

Region markieren

Ein bestimmter Bereich kann entweder mit der Maus markiert werden, oder man geht mit den Cursor an den Beginn des Bereiches und drückt dort C-SPC. Dann geht man mit dem Cursor zum Ende des Bereiches. Dabei sieht man, das dieser Bereich ausgewählt wird.

nach oben

C-w --> Ausschneiden

Hat man einen Bereich ausgewählt, kann man Ihn durch die Tastenkombination <STRG>+w ausschneiden.

nach oben

M-w --> Kopieren

Hat man einen Bereich ausgewählt, kann mann Ihn durch die Tastenkombination <ALT>+w in die Zwischenablage kopieren.

nach oben

C-y / M-y --> Einfügen / vorherige einfügen

Der letzte Text, der zuvor durch Ausschneiden oder Einfügen in die Zwischenablage aufgenommen wurde, kann durch die Tastenkombination <STRG>+y an der Stelle des Cursors eingefügt werden. Um Texte einzufügen, die davor in die Zwischenablage aufgenommen worden sind, betätigt man nach der Tastenkombination <STRG>-y die Tastenkombination <ALT>+y. Mit jeden weitern drücken von <ALT>+y wird der aktuell eingefügte Text durch den nächsten Text ersetzt, der in der Zwischenablage enthalten ist. Dies geht solange bis man wieder beim ersten Eintrag angelangt ist.

nach oben

C-x u Rückgängig

Mit ~<STRG>+x u~ ist es möglich die letzten Aktionen wieder rückgängig zu machen. Alternativ kann man hierfür auch kurz C-_ verwenden.

nach oben

Haupt-Modies

Beschreibung

Hauptmodies stellen komplette Programme dar, die immer einen bestimmten Zweck dienen. So kann der emacs zum Programmieren in verschiedenen Programmiersprachen, zur Erfassung von Dokumentationen, zum Mail schreiben oder auch zum spielen verwendet werden. Für jede Anwendung gibt es einen entsprechenden Hauptmodus. In der Regel wird der passende Hauptmodus automatisch durch speichern einer Datei mit einer bestimmten Endung eingeschaltet.

nach oben

org-mode

Was ist der org-Mode

Dieses Dokument ist mit dem org-mode erstellt worden. Der org-mod gestattet es auf einfache Weise ein Dokument zu strukturieren und Tabellen und Listen zu erstellen. Um diesen nutzen zu können, musste ich unter Debian zunächst durch: sudo apt get install org-mode den org-mode installieren. Danach wird der org-mode durch speichern einer Datei mit der Endung org gestartet.

nach oben

Struktur

Sektionen durch > * <

Im org-mode wird der Text in Sektionen mit einer Überschrift unterteilt. Die Überschrift einer Sektion beginnt mit einem >*<. Für jede Untersektion wird jeweils ein Stern hinzugefügt. Zur besseren Übersicht bekommt jede Einrücktiefe eine gesonderte Einfärbung. Somit sind die verschiedenen Stufen gut voneinander zu unterscheiden. Die Einrücktiefe kann auch durch <ALT>+Rechts/Links geändert werden. Mit STRG-c RET wird unter dem eintrag ein Eintrag mit gleicher Einrücktiefe erstellt.

TODO Status einer Sektion

Beschreibung

Jede Sektion kann auch mit einem Status versehen werden, indem man in der Überschrift bei gedrückter SCHIFT-Taste die Pfeil-Tasten rechts oder links drückt. Das gleiche ereicht man mit der Tastenkombination C-c C-t.

nach oben

Standard

Standardmäßig wird zwischen folgenden Zuständen iterriert:

  • TODO
  • DONE
  • Nichts

nach oben

Anpassungen

Diese Zustände können wie folgt angepasst werden:

#+SEQ_TODO: offen | erledigt
itteriert durch offen und erledigt
#+TYP_TODO: Maik Nicole | erledigt
itteriert durch die Namen und erledigt.
TODO keyword face
setzt das Aussehen der Schlüsselworte

(setq org-todo-keyword-faces '(("TODO" . org-warning) ("DEFERRED" . shadow) ("CANCELED" . (:foreground "blue" :weight bold))))

Allerdings funktioniert dies erst nach einem Neuen einlesen des Puffers.

nach oben

[#3] Priorität

Nutzt man bei gedrückter SCHIFT-Taste die Pfeil-runter-Taste, so wird zusätzlich eine Priorität [A;B oder C] gesetzt, die allerdings nicht exportiert wird. Anpassbar durch:

  • #+PRIORITIES: A C B

#+PRIORITIES: 1 3 2

nach oben

Listen durch > - <, > + <

Listen werden einfach durch ein Minus-Zeichen + Leerzeichen am Anfang erzeugt. Eventuelle Unterpunkte werden dann durch eine Einrückung erreicht. Auch diese Unterpunkte können wieder mit der <Tab>-Taste ein und ausgerollt werden.

  • Liste
    1. Unterpunkt 1
    2. Unterpunkt 2
      • Unterpunkt von Unterpunkt 2

Mit Schift + Pfeiltaste kann das Listenzeichen geändert werden!

Beschreibungen

Listeneinträge können direkt durch die Zeichen '::' Beschreibungen hinzugefügt werden.

Listeneintrag
Beschreibung
Untereintrag
Beschreibung Untereintrag
Listeneintrag
Beschreibung

nach oben

Todo-Liste

Ein Todo-Eintrag kann durch ein Leerzeichen zwischen einer öffnende + schließende eckige Klammer hinter dem Listenzeichen erstellt werden:

  • [X] noch zu erledigen <-- C-c C-c Schaltet die Option ein oder aus
  • [ ] erledigt (C-c C-x C-b)
  • [ ] Todo-Liste mit Numerischen Zähler [0/1]
    • [ ] Unterpunkt Todo-Liste mit Prozentualen Zähler [0%]

Nummerische Zähler werden durch [/] angehängt Prozentuale Zähler werden durch [%] angehängt

nach oben

Umstrukturierung mit M-Pfeiltaste

<ALT>-Taste gedrückt halten und:

  • Pfeil rechts --> Als Unterpunkt tiefer einrücken
  • Pfeil links --> Höhere Ebene durch geringere Einrückung
  • Pfeil hoch --> Element mit dem darüber liegendem tauschen
  • Pfeil runter --> Element mit dem darunter liegendem tauschen

nach oben

Datum und Zeit

C-c .
Datum über einen Kalender
C-c up/down
In der Konsole, zähle Datumswert unter Cursor um eins hoch/runter
SHIFT+UP
M-O 2 A
SHIFT+Down
M-O 2 B
S-up/down
Unter X, zähle Datumswert unter Cursor um eins hoch/runter

<2015-03-09 Mo>

nach oben

Tabellen :Tabelle:

Es leicht eine Tabelle zu erzeugen, indem man einfach die einzelnen Spalten mit dem <|>-Zeichen einschließt. Trennlinien werden Dann mit einem Minus-Zeichen erstellt.

Spalte 1 Spalte 2
zeile1 1.Zeile
Zeile2 2.Zeile

nach oben

Links

Code

Shell

  • #BEGIN_SRC
  • echo "Hello World"
  • #+END_SRC

ergibt

echo "Hello World"

nach oben

Python

  • #BEGIN_SRC
  • print "Hello World"
  • #+END_SRC

ergibt

*#+BEGIN_SRC python* print ("Hallo Welt") *#+END_SRC*

nach oben

Tags :Struktur:Tag:org:mode:

Nach Tags kann gesucht, gefiltert und gelinkt werden. Um ein Tag zu vergeben wird in der Überschrift die Tastenkombination C-c C-c verwendet.

nach oben

Kommentare

Komentare werden nicht exportiert. Sie werden durch ein >#< am Anfang oder durch das Schlüsselwort COMMENT gekennzeichnet.

nach oben

Navigation

C-c C-e --> Export

Mit ><STRG>+c <STRG>+e< bekommt man eine Auswahl von möglichen Formaten, in die der Text exportiert werden kann. Durch Auswahl des entsprechenden Buchstabens, wird die Datei im selben Verzeichnis in dem ausgewählten Format erstellt. So ist es zum Beispiel leicht möglich den Text als HTML-Seite oder auch als PDF-Dokument zu speichern.

nach oben

Split

C-c C-x b
Kopiert die aktuelle Sektion in einen neuen Buffer

nach oben

Emacs als IDE

Autovervollständigung

AutoComplete

Mit dieser Erweiterung ist es möglich eine Autovervollstädigung zu erreichen, bei der die möglichen Fortsetzungen nicht in einem extra Fenster sondern in einem Auswahlmenü angezeigt werden.

Zur Nutzung muss das Paket auto-complete-el installiert werden.

Dann ist das Paket bei mir noch immer nicht nutzbar. Ich habe gemäß Anleitung die load-path-Variable zu überprüfen. Dies bewerkstelle ich mit:

C-h v load-path RET

Allerdings ist damit alles in Ordnung meine auto-complete-et-Datei ist über das Verzeichnis ~/usr/share/emacs23/site-lisp/auto-complete~ das in der Variable gelistet ist. Mein dict-Verzeichnis befindet sich im Verzeichnis ~/usr/share/auto-complete~.

Ich habe jetzt in der ~/.emacs folgende Zeilen hinzugefügt, mit denen in der Folge die Autovervollständigung von Code in Python automatisch funktioniert:

; Für den Auto-Complete-Mode
; Zuerst installieren über sudo apt-get install auto-complete-el
; dict befindet sich im Verzeichn is /usr/share/auto-complete

(require 'auto-complete-config)
(ac-config-default)o
(add-to-list 'ac-dictionary-directories "/usr/share/auto-complete/dict")

nach oben

Code-Schnipsel

Einfügen kompletter Code-Schnipsel ist mit Yasnippet möglich. So lassen sich auf einfach Weise ständig wiederkehrende Code-Fragmente einfügen. Dabei ist es sogar möglich innerhalb dieser Templates Sprungmarken zu definieren, an die der Cursor nach einander zum ausfüllen springen soll.

Einrichtung

Installation

Yasnippet muss zunächst mit

sudo apt-get install yasnippet

installiert werden.

nach oben

Konfiguration

Dann gilt es yasnippet zu konfigurieren. Einige Schnipsel sind bereits im Ordner der snippets.el-Datei gespeichert. Dies ist in meinem Fall: ~/usr/share/emacs/site-lisp/yasnippet/snippets/~ Da alle Dateien des Ordners Root gehören, ich allerdings auch die Möglichkeit haben will, mir eigene Schnipsel zu erstellen, gilt es zunächst eine Anpassung zu machen. Hierzu habe ich das Customizing von emacs genutzt:

  • M-x customize-variable
  • Variable: yas/root-directory
  • Value Menu auswählen
  • INS auswählen
  • zuerst den Pfad: *~/.emacs.d/snippets/* eintragen
  • INS nochmals auswählen
  • als zweiten Pfad */usr/share/emacs/site-lisp/yasnippet/snippets/* eintragen

Dadurch wird unter *(custom-set-variables* in der ~.emacs~-Datei folgender Eintrag hinzugefügt:

'(yas/root-directory (quote ("~/.emacs.d/snippets/" "/usr/share/emacs/site-lisp/yasnippet/snippets/")) nil (yasnippet)))

nach oben

Erstellen von Snippets

Nun kann ich eine den jeweiligen Modis entsprechende Ordnerstruktur einrichten unter der ich meine Snippets erstelle und speichere. Will man nun einen neuen Snippet für einen Modus erstellen, für den es noch keinen Ordner gibt, so wird dieser Ordner auf Nachfrage neu erstellt. Dazu zunächst nach Snippets suchen:

M-x yas/find-snippets

Ich habe mir einen Ordner für den snippet-mode erstellt und darin die Datei kopf mit folgenden Inhalt angelegt:

_ # -*- mode: snippet -*-
_ # name: mkSnippet
_ # key: kopf
_ # --
_ # -*- mode: snippet -*-
_ # name: $1
_ # key: $2
_ # --
  $0

Dadurch ist es leicht möglich neue Snippets zu erstellen. Ich brauche jetzt nur noch

  • eine Datei im jeweiligen Ordner mit belibigen Namen erstellen
  • den snippet-mode starten: M-x snippet-mode
  • kopf-tab eingeben und das Formular ausfüllen:
    • unter Name den Namen eintragen
    • mit Tab zum Key-Feld wechseln
      • Den Schlüssel, der später unter diesem Modus expandiert werden soll eintragen.
    • mit Tab zum Ende springen
    • Den Code-Schnipsel eingeben, wobei gilt:
      ${1:Variablename}
      Cursorpunkt nach dem expandieren
      ${2:Variablename}
      Cursorpunkt nach dem ersten Tab
      ${n:Variablename}
      Cursorpunkt nach dem n-ten Tab
      $0
      Cursorpunkt zum Schluss

Der Variablenname kann zur Erklärung eingefügt werden und wird später im Formular automatisch beim Eintippen überschrieben. Die Schlußmarke *$0* kann keinen Variablennamen aufnehmen.

nach oben

Einlesen des neu erstellten Schnipsels

Emacs neu starten oder einfach

M-x yas/reload-all

ausführen.

nach oben

Beispiel: Mein html-Grundgerüst für meine Seiten

_# -*- mode: snippet -*-
_# name: myxhtml
_# key: myxml
_# --
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>${1:Titel} </title>
    <link type="text/css" rel="stylesheet" href="${2:../style.css}" />
  </head>
  <body>
    <h1 id="Kopf">${3:Überschrift}<h1>
    <div id="Navi">
      <ul>
        <li> <a href="${4:Link zur Navigation}">${5:Bezeichnung im Menü}</a></li>
      </ul>
    </div>
    <div id="Inhalt">
      $0
    </div>
  </body>
</html>  

Danach kann ich durch Eingabe von myxml+Tab mein Grundgerüst erhalten.

nach oben

Code-Browsing

Unter Code-Browsing verstehe ich die Möglichkeit auf einfache Weise Codestellen anspringen zu können. So möchte ich jeweils zur Stelle der Definition von Funktionen und Variablen springen können, ähnlich wie mir die bei geany gegeben ist. Ich möchte folgende Möglichkeiten zur Verfügung haben:

  • Finden der Definition von Variabeln und Funktionen
  • Finden der Stellen, wo diese Variabeln und Funktionen genutzt werden

ECB

ECB steht für EmacsCodeBrowsing und erfüllt zum einen meine Ansprüche zum anderen scheint es mir überladen zu sein. Bevor ich dies ausprobiere, will ich noch schauen, ob es vielleicht einfachere Alternativen gibt. Mir genügt hier die Nutzung der Speedbar und die Funktionen die rope zur Verfügung stellt vollständig.

nach oben

Speedbar

Speedbar ermöglicht eine Übersicht von Dateien, Funktionen und Variablen. Dies erfolgt in einem neuen Fenster. Da dies vor allem in einer Konsole nicht wirklich funktioniert, habe ich die Funktion durch eine sr-speedbar erweitert, die die selbe Funktion in einem parallel angezeigten Buffer-Window bereitstellt.

Installation

Speedbar ist bereits vorhanden und funktionstüchtig SrSpeedbar.el habe ich von http://www.emacswiki.org/emacs/download/sr-speedbar.el heruntergeladen und in das Verzeichnis ~/.emacs.de/el/ kopiert.

Quellcode

;;; sr-speedbar.el --- Same frame speedbar

;; Author: Sebastian Rose <sebastian_rose@gmx.de>
;; Maintainer: Sebastian Rose <sebastian_rose@gmx.de>
;;             Peter Lunicks <plunix@users.sourceforge.net>
;; Copyright (C) 2008, 2009, Sebastain Rose, all rights reserved.
;; Copyright (C) 2008, 2009, Andy Stewart, all rights reserved.
;; Copyright (C) 2009, Peter Lunicks, all rights reversed.
;; Created: 2008
;; Version: 0.1.9
;; Last-Updated: 2013-03-09 20:56:35
;; URL: http://www.emacswiki.org/emacs/download/sr-speedbar.el
;; Keywords: speedbar, sr-speedbar.el
;; Compatibility: GNU Emacs 22 ~ GNU Emacs 24
;;
;; Features that might be required by this library:
;;
;;  `speedbar' `advice' `cl'
;;

;;; This file is NOT part of GNU Emacs

;;; License
;;
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING.  If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
;; Floor, Boston, MA 02110-1301, USA.

;;; Commentary:
;;
;; The sr-speedbar.el was created just because I could not believe what I
;; read on http://www.emacswiki.org/cgi-bin/wiki/Speedbar.  They wrote there
;; that it is not possible to show the speedbar in the same frame.  But, as
;; we all know, ecb had this already.  So I started as some kind of joke :)
;; But when I found it useful and use it all the time.
;;
;; Now you type windows key with 's' (`s-s' in Emacs) will show the speedbar
;; in an extra window, same frame.  You can customize the initial width of the
;; speedbar window further down for console/DOS and X/Win/MacOS separately.
;;
;; Below are commands you can use:
;;
;; `sr-speedbar-open'                   Open `sr-speedbar' window.
;; `sr-speedbar-close'                  Close `sr-speedbar' window.
;; `sr-speedbar-toggle'                 Toggle `sr-speedbar' window.
;; `sr-speedbar-select-window'          Select `sr-speedbar' window.
;; `sr-speedbar-refresh-turn-on'        Turn on refresh speedbar content.
;; `sr-speedbar-refresh-turn-off'       Turn off refresh speedbar content.
;; `sr-speedbar-refresh-toggle'         Toggle refresh speedbar content.
;;
;; Enjoy! ;)
;;

;;; Installation:
;;
;; Copy sr-speedbar.el to your load-path and add to your ~/.emacs
;;
;;  (require 'sr-speedbar)
;;  (global-set-key (kbd "s-s") 'sr-speedbar-toggle)
;;
;; ... or any key binding you like.
;;

;;; Customize:
;;
;; `sr-speedbar-width-x'
;;      The `sr-speedbar' window width under WINDOW system.
;; `sr-speedbar-width-console'
;;      The `sr-speedbar' window width under CONSOLE.
;; `sr-speedbar-max-width'
;;      The max window width allowed remember.
;; `sr-speedbar-delete-windows'
;;      Whether delete other window before showing up.
;; `sr-speedbar-skip-other-window-p'
;;      Whether skip `sr-speedbar' window when use
;;      command `other-window' select window in cyclic ordering of windows.
;; `sr-speedbar-auto-refresh'
;;      Control status of refresh speedbar content.
;; `sr-speedbar-right-side'
;;      Puts the speedbar on the right side if non-nil (else left).
;;
;; All above setup can customize by:
;;      M-x customize-group RET sr-speedbar RET
;;

;;; Change log:
;;
;; * 09 March 2013:
;;   * Tharre:
;;      * Remove Emacs 21 compatibility code as it fails to compile on Emacs 24.
;;
;; * 20 July 2009:
;;   * Peter Lunicks:
;;      * Add new option `sr-speedbar-right-side' to control which
;;        side of the frame the speedbar appears on.
;;
;; * 18 Feb 2009:
;;   * Andy Stewart:
;;      * Fix bug between ECB and `sr-speedbar-close'.
;;
;; * 29 Jan 2009:
;;   * Andy Stewart:
;;      * Fix doc.
;;
;; * 13 Jan 2009:
;;   * Andy Stewart:
;;      * Use `emacs-major-version' instead comment for Emacs 21 compatibility.
;;      * Rewrite advice for `pop-to-buffer' to avoid `pop-to-buffer' not effect
;;        when have many dedicated window in current frame.
;;      * Rewrite advice for `delete-other-windows' to avoid use common variable
;;        `delete-protected-window-list' and use `window-dedicated-p' instead.
;;        Remove variable `delete-protected-window-list' and function
;;        `sr-speedbar-dedicated-match-protected-window-p'.
;;
;; * 04 Jan 2009:
;;   * Andy Stewart:
;;      * Add new option `sr-speedbar-auto-refresh' control refresh content.
;;      * Add new functions:
;;        `sr-speedbar-refresh-turn-on',
;;        `sr-speedbar-refresh-turn-off',
;;        `sr-speedbar-refresh-toggle'.
;;      * Fix doc.
;;
;; * 30 Dec 2008:
;;   * Andy Stewart:
;;      * Rewrite advice for `delete-other-windows' for fix the bug
;;        with window configuration save and revert.
;;      * Rewrite advice for `delete-window', now just remember window
;;        width before deleted, and can use `delete-window' do same effect
;;        as command `sr-speedbar-close'.
;;      * Add new option `sr-speedbar-max-width'.
;;        Remember window width before hide, except larger than value of
;;        `sr-speedbar-max-width'.
;;      * Add new variable `delete-protected-window-list', for protected
;;        special window don't deleted.
;;        This variable is common for any extension that use dedicated
;;        window.
;;      * Fix doc.
;;
;; * 29 Dec 2008:
;;   * Andy Stewart:
;;      * Pick-up and refactory code that use `buffer-live-p' or `window-live-p',
;;        and replace with `sr-speedbar-buffer-exist-p' and
;;        `sr-speedbar-window-exist-p'.
;;      * Rename some function with prefix `sr-speedbar-' to avoid
;;        conflict with other functions.
;;      * Pick-up the code that handle advice for `other-window',
;;        and replace with function `sr-speedbar-handle-other-window-advice'.
;;      * Clean up code, make more clear.
;;
;; * 21 Dec 2008:
;;   * Andy Stewart:
;;      * Fix the bug `sr-speedbar-open' and `sr-speedbar-close'.
;;      * Fix doc.
;;
;; * 20 Dec 2008
;;   * Andy Stewart:
;;      * Fix `ad-advised-definition-p' error.
;;      * Fix doc.
;;
;; * 17 Dec 2008
;;   * Andy Stewart:
;;      * Add new option `sr-speedbar-skip-other-window-p' and new advice
;;        for `other-window', make user skip select `sr-speedbar' window
;;        when use command `other-window'.
;;      * Fix the name of advice, make more clear.
;;      * Fix the bug `sr-speedbar-select-window' when no live window exist.
;;      * Fix doc.
;;
;; * 16 Dec 2008:
;;   * Andy Stewart:
;;      * Fix the bug of `sr-speedbar-refresh', use `default-directory'
;;        get refresh directory instead through function in `dired'.
;;      * Fix `window-live-p' bug, check window valid value before use
;;        `window-live-p' test `sr-speedbar-window'.
;;      * Fix `buffer-live-p' bug, check buffer valid value before use
;;        `buffer-live-p' test `speedbar-buffer'.
;;      * Add advice `pop-to-buffer' to make function `display-buffer'
;;        can pop-up window when just have two windows (one is `sr-speedbar'
;;        window) in current frame.
;;      * Add group `sr-speedbar'.
;;        More better customize interface through `customize-group'.
;;
;; * 28 Sep 2008:
;;   * Andy Stewart:
;;      * Fix a bug, when `sr-speedbar-toggle' many times, window width
;;        will increment automatically.
;;      * Use around advices replace, make code simple.
;;      * Use `sr-speedbar-open' replace `sr-speedbar-no-separate-frame'.
;;      * Clean up code.
;;
;; * 28 Sep 2008:
;;   * Sebastian:
;;      * set `sr-speedbar-delete-windows' to nil to avoid
;;        the removal of other windows.
;;
;; * 26 Jun 2008:
;;   * Sebastain:
;;      * Added Andy Stewart's patch to refresh the speedbar's contents.
;;        Thanks for this one!
;;
;; * Init:
;;   * Sebastian:
;;      * Added some lines to get it working:
;;      * splitting the window and remember it,
;;      * changing the way speedbar finds a file.
;;      * File view of speedbar is now working all right.
;;      * C-x 1 in other window deletes speedbar-window, just calling
;;        M-x sr-speedbar-no-separate-frame again is fine now.
;;      * Toggle speedbar works, width is save when toggling.
;;      * Recalc speedbar width if window-width - speedbar-width <= 0
;;      * Speedbar window is now dedicated to speedbar-buffer.
;;

;;; Acknowledgements:
;;
;;      All emacsers ... :)
;;

;;; Bug
;;
;;

;;; TODO
;;
;;
;;

;;; Require
(require 'speedbar)
(require 'advice)
(require 'cl)

;;; Code:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; User Customization ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defgroup sr-speedbar nil
  "Same frame speedbar."
  :group 'speedbar)

(defcustom sr-speedbar-width-x 24
  "Initial width of `sr-speedbar-window' under window system."
  :type 'integer
  :group 'sr-speedbar)

(defcustom sr-speedbar-width-console 24
  "Initial width of `sr-speedbar-window' on console."
  :type 'integer
  :group 'sr-speedbar)

(defcustom sr-speedbar-max-width 50
  "The max width limit that window allowed.
Default, if hide `sr-speedbar' window will remember
window width, except the window width larger than
this value."
  :type 'integer
  :group 'sr-speedbar)

(defcustom sr-speedbar-auto-refresh t
  "Automatically refresh speedbar content when changed directory.
Default is t."
  :type 'boolean
  :set (lambda (symbol value)
         (set symbol value))
  :group 'sr-speedbar)

(defcustom sr-speedbar-right-side t
  "Show the speedbar to the right side of the current window.
If nil, the speedbar will appear on the left.
Default is t."
  :type 'boolean
  :set (lambda (symbol value)
         (set symbol value))
  :group 'sr-speedbar)

(defcustom sr-speedbar-delete-windows nil
  "Allow the speedbar to delete other windows before showing up.
If nil, speedbar will not touch your window configuration.
Otherwise `delete-other-windows' will be called before showing
the speedbar.

Default is nil."
  :type 'boolean
  :group 'sr-speedbar)

(defcustom sr-speedbar-skip-other-window-p nil
  "Whether skip `sr-speedbar' window with `other-window'.
Default, can use `other-window' select window in cyclic
ordering of windows.  But sometimes we don't want select
`sr-speedbar' window use `other-window'.
Just want make `sr-speedbar' window as a view sidebar.

So please turn on this option if you want skip
`sr-speedbar' window with `other-window'.

Default is nil."
  :type 'boolean
  :set (lambda (symbol value)
         (set symbol value)
         (when (ad-advised-definition-p 'other-window)
           (sr-speedbar-handle-other-window-advice value)))
  :group 'sr-speedbar)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Constant ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconst sr-speedbar-version "0.1.4"
  "Current version.")

(defconst sr-speedbar-buffer-name "*SPEEDBAR*"
  "The buffer name of sr-speedbar.")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defvar sr-speedbar-width nil
  "Initial width of speedbar-window.")

(defvar sr-speedbar-window nil
  "Speedbar window.")

(defvar sr-speedbar-last-refresh-dictionary nil
  "The last refresh dictionary record of 'sr-speedbar-refresh'.")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Interactive functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;###autoload
(defun sr-speedbar-toggle ()
  "Toggle sr-speedbar window.
Toggle visibility of sr-speedbar by resizing
the `sr-speedbar-window' to a minimal width
or the last width when visible.
Use this function to create or toggle visibility
of a speedbar-window.  It will be created if necessary."
  (interactive)
  (if (sr-speedbar-exist-p)
      (sr-speedbar-close)
    (sr-speedbar-open)))

;;;###autoload
(defun sr-speedbar-open ()
  "Create `sr-speedbar' window."
  (interactive)
  (if (not (sr-speedbar-exist-p))
      (let ((current-window (selected-window)))
        ;; Ensure only one window is there
        ;; when `sr-speedbar-delete-windows' is non-nil
        (if sr-speedbar-delete-windows
            (delete-other-windows))
        ;; Whether activate `other-window' advice
        ;; to skip `sr-speedbar' window when use `other-window'.
        (sr-speedbar-handle-other-window-advice sr-speedbar-skip-other-window-p)
        ;; Switch buffer
        (if (sr-speedbar-buffer-exist-p speedbar-buffer)
            (unless (sr-speedbar-window-exist-p sr-speedbar-window) ;if `sr-speedbar' window is not exist
              (sr-speedbar-get-window))
          (if (<= (sr-speedbar-current-window-take-width) sr-speedbar-width) ;if current window width is narrower than `sr-speedbar-width'
              (sr-speedbar-recalculate-width)) ;recalculate width of `sr-speedbar'
          (sr-speedbar-get-window)             ;get `sr-speedbar' window that split current window
          (setq speedbar-buffer (get-buffer-create sr-speedbar-buffer-name)
                speedbar-frame (selected-frame)
                dframe-attached-frame (selected-frame)
                speedbar-select-frame-method 'attached
                speedbar-verbosity-level 0 ;don't say anything, i don't like ... :)
                speedbar-last-selected-file nil)
          (set-buffer speedbar-buffer)
          (buffer-disable-undo speedbar-buffer) ;make disable in speedbar buffer, otherwise will occur `undo-outer-limit' error
          (speedbar-mode)
          (speedbar-reconfigure-keymaps)
          (speedbar-update-contents)
          (speedbar-set-timer 1)
          ;; Add speedbar hook.
          (add-hook 'speedbar-before-visiting-file-hook 'sr-speedbar-before-visiting-file-hook t)
          (add-hook 'speedbar-before-visiting-tag-hook 'sr-speedbar-before-visiting-tag-hook t)
          (add-hook 'speedbar-visiting-file-hook 'sr-speedbar-visiting-file-hook t)
          (add-hook 'speedbar-visiting-tag-hook 'sr-speedbar-visiting-tag-hook t)
          ;; Add `kill-buffer-hook'.
          (add-hook 'kill-buffer-hook 'sr-speedbar-kill-buffer-hook) ;add `kill-buffer-hook'
          ;; Auto refresh speedbar content
          ;; if option `sr-speedbar-auto-refresh' is non-nil
          (sr-speedbar-handle-auto-refresh sr-speedbar-auto-refresh))
        (set-window-buffer sr-speedbar-window (get-buffer sr-speedbar-buffer-name))
        (set-window-dedicated-p sr-speedbar-window t) ;make `sr-speedbar-window' dedicated to speedbar-buffer.
        (select-window current-window))
    (message "`sr-speedbar' window has exist.")))

(defun sr-speedbar-close ()
  "Close `sr-speedbar' window and save window width."
  (interactive)
  (if (sr-speedbar-exist-p)
      (let ((current-window (selected-window)))
        ;; Remember window width.
        (sr-speedbar-select-window)
        (sr-speedbar-remember-window-width)
        ;; Close window.
        (if (and (require 'ecb nil t)
                 ecb-activated-window-configuration)
            ;; Toggle ECB window when ECB window activated.
            (progn
              (ecb-deactivate)
              (ecb-activate))
          ;; Otherwise delete dedicated window.
          (delete-window sr-speedbar-window)
          (if (sr-speedbar-window-exist-p current-window)
              (select-window current-window))))
    (message "`sr-speedbar' window is not exist.")))

(defun sr-speedbar-select-window ()
  "Force the windows that contain `sr-speedbar'."
  (interactive)
  (if (sr-speedbar-exist-p)
      (select-window sr-speedbar-window)
    (message "`sr-speedbar' window is not exist.")))

(defun sr-speedbar-refresh-turn-on ()
  "Turn on refresh content automatically."
  (interactive)
  (setq sr-speedbar-auto-refresh t)
  (sr-speedbar-handle-auto-refresh sr-speedbar-auto-refresh t))

(defun sr-speedbar-refresh-turn-off ()
  "Turn off refresh content automatically."
  (interactive)
  (setq sr-speedbar-auto-refresh nil)
  (sr-speedbar-handle-auto-refresh sr-speedbar-auto-refresh t))

(defun sr-speedbar-refresh-toggle ()
  "Toggle refresh content status."
  (interactive)
  (setq sr-speedbar-auto-refresh (not sr-speedbar-auto-refresh))
  (sr-speedbar-handle-auto-refresh sr-speedbar-auto-refresh t))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; utilise functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun sr-speedbar-exist-p ()
  "Return `non-nil' if `sr-speedbar' is exist.
Otherwise return nil."
  (and (sr-speedbar-buffer-exist-p speedbar-buffer)
       (sr-speedbar-window-exist-p sr-speedbar-window)))

(defun sr-speedbar-window-p ()
  "Return `non-nil' if current window is `sr-speedbar' window.
Otherwise return nil."
  (equal sr-speedbar-buffer-name (buffer-name (window-buffer))))

(defun sr-speedbar-remember-window-width ()
  "Remember window width."
  (let ((win-width (sr-speedbar-current-window-take-width)))
    (if (and (sr-speedbar-window-p)
             (> win-width 1)
             (<= win-width sr-speedbar-max-width))
        (setq sr-speedbar-width win-width))))

(defun sr-speedbar-recalculate-width ()
  "Calculate the speedbar width with respect of window system."
  (if (and window-system
           (not (string= "pc" window-system)))
      (setq sr-speedbar-width sr-speedbar-width-x)
    (setq sr-speedbar-width sr-speedbar-width-console)))

(or sr-speedbar-width (sr-speedbar-recalculate-width)) ;initialization `sr-speedbar-width'

(defun sr-speedbar-get-window ()
  "Get `sr-speedbar' window."
  (let ((current-window (selected-window))
        ;; Get split new window.
        (new-window (split-window
                     (selected-window)
                     (if sr-speedbar-right-side
                         (- (sr-speedbar-current-window-take-width) sr-speedbar-width)
                       sr-speedbar-width)
                     t)))
    ;; Select split window.
    (setq sr-speedbar-window
          (if sr-speedbar-right-side
              ;; Select right window when `sr-speedbar-right-side' is enable.
              new-window
            ;; Otherwise select left widnow.
            current-window))))

(defun sr-speedbar-before-visiting-file-hook ()
  "Function that hook `speedbar-before-visiting-file-hook'."
  (select-window (previous-window)))

(defun sr-speedbar-before-visiting-tag-hook ()
  "Function that hook `speedbar-before-visiting-tag-hook'."
  (select-window (previous-window)))

(defun sr-speedbar-visiting-file-hook ()
  "Function that hook `speedbar-visiting-file-hook'."
  (select-window (previous-window)))

(defun sr-speedbar-visiting-tag-hook ()
  "Function that hook `speedbar-visiting-tag-hook'."
  (select-window (previous-window)))

(defun sr-speedbar-kill-buffer-hook ()
  "Function that hook `kill-buffer-hook'."
  (when (eq (current-buffer) speedbar-buffer)
    (setq speedbar-frame nil
          dframe-attached-frame nil
          speedbar-buffer nil)
    (speedbar-set-timer nil)
    (remove-hook 'speedbar-before-visiting-file-hook 'sr-speedbar-before-visiting-file-hook)
    (remove-hook 'speedbar-before-visiting-tag-hook 'sr-speedbar-before-visiting-tag-hook)
    (remove-hook 'speedbar-visiting-file-hook 'sr-speedbar-visiting-file-hook)
    (remove-hook 'speedbar-visiting-tag-hook 'sr-speedbar-visiting-tag-hook)))

(defun sr-speedbar-refresh ()
  "Refresh the context of speedbar."
  (when (and (not (equal default-directory sr-speedbar-last-refresh-dictionary)) ;if directory is change
             (not (sr-speedbar-window-p))) ;and is not in speedbar buffer
    (setq sr-speedbar-last-refresh-dictionary default-directory)
    (speedbar-refresh)))

(defun sr-speedbar-handle-auto-refresh (activate &optional echo-show)
  "Automatically refresh speedbar content when changed directory.
Do nothing if option ACTIVATE is nil.
Will display message if ECHO-SHOW is non-nil."
  (if activate
      (progn
        (add-hook 'speedbar-timer-hook 'sr-speedbar-refresh)
        (if echo-show (message "Turn on speedbar content refresh automatically.")))
    (remove-hook 'speedbar-timer-hook 'sr-speedbar-refresh)
    (if echo-show (message "Turn off speedbar content refresh automatically."))))

(defun sr-speedbar-current-window-take-width (&optional window)
  "Return the width that WINDOW take up.
If WINDOW is nil, get current window."
  (let ((edges (window-edges window)))
    (- (nth 2 edges) (nth 0 edges))))

(defun sr-speedbar-window-dedicated-only-one-p ()
  "Only have one non-dedicated window."
  (interactive)
  (let ((window-number 0)
        (dedicated-window-number 0))
    (walk-windows
     (lambda (w)
       (with-selected-window w
         (incf window-number)
         (if (window-dedicated-p w)
             (incf dedicated-window-number)))))
    (if (and (> dedicated-window-number 0)
             (= (- window-number dedicated-window-number) 1))
        t nil)))

(defun sr-speedbar-window-exist-p (window)
  "Return `non-nil' if WINDOW is exist.
Otherwise return nil."
  (and window (window-live-p window)))

(defun sr-speedbar-buffer-exist-p (buffer)
  "Return `non-nil' if BUFFER is exist.
Otherwise return nil."
  (and buffer (buffer-live-p buffer)))

(defun sr-speedbar-handle-other-window-advice (activate)
  "Handle advice for function `other-window'.
If ACTIVATE is `non-nil' enable advice `sr-speedbar-other-window-advice'.
Otherwise disable it."
  (if activate
      (ad-enable-advice 'other-window 'after 'sr-speedbar-other-window-advice)
    (ad-disable-advice 'other-window 'after 'sr-speedbar-other-window-advice))
  (ad-activate 'other-window))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Advices ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defadvice delete-other-windows (around sr-speedbar-delete-other-window-advice activate)
  "This advice to make `sr-speedbar' window can't deleted by command `delete-other-windows'."
  (let ((sr-speedbar-active-p (sr-speedbar-window-exist-p sr-speedbar-window)))
    (if sr-speedbar-active-p
        (let ((current-window (selected-window)))
          (dolist (win (window-list))
            (when (and (window-live-p win)
                       (not (eq current-window win))
                       (not (window-dedicated-p win)))
              (delete-window win))))
      ad-do-it)))

(defadvice delete-window (before sr-speedbar-delete-window-advice activate)
  "This advice to remember `sr-speedbar' window width before deleted.
Use `delete-window' delete `sr-speedbar' window have same effect as `sr-speedbar-close'."
  ;; Remember window width before deleted.
  (sr-speedbar-remember-window-width))

(defadvice pop-to-buffer (before sr-speedbar-pop-to-buffer-advice activate)
  "This advice is to fix `pop-to-buffer' problem with dedicated window.
Default, function `display-buffer' can't display buffer in select window
if current window is `dedicated'.

So function `display-buffer' conflict with `sr-speedbar' window, because
`sr-speedbar' window is `dedicated' window.

That is to say, when current frame just have one `non-dedicated' window,
any functions that use `display-buffer' can't split windows
to display buffer, even option `pop-up-windows' is enable.

And the example function that can occur above problem is `pop-to-buffer'."
  (when (and pop-up-windows                            ;`pop-up-windows' is enable
             (sr-speedbar-window-dedicated-only-one-p) ;just have one `non-dedicated' window
             (sr-speedbar-window-exist-p sr-speedbar-window)
             (not (sr-speedbar-window-p))) ;not in `sr-speedbar' window
    (split-window-vertically)
    (windmove-down)))

(defadvice other-window (after sr-speedbar-other-window-advice)
  "Default, can use `other-window' select window in cyclic ordering of windows.
But sometimes we don't want select `sr-speedbar' window use `other-window'.
Just want make `sr-speedbar' window as a view sidebar.

This advice can make `other-window' skip `sr-speedbar' window."
  (let ((count (or (ad-get-arg 0) 1)))
    (when (and (sr-speedbar-window-exist-p sr-speedbar-window)
               (eq sr-speedbar-window (selected-window)))
      (other-window count))))

(provide 'sr-speedbar)

;;; sr-speedbar.el ends here

;;; LocalWords:  sr Sebastain ecb Sep speedbar's  Recalc dframe keymaps pc
;;; LocalWords:  decicated uncomment

nach oben

Konfiguration

load-path erweitern

Damit das Modul vom emacs auch gefunden wird, muss ich zunächst die .emacs-Datei wie folgt erweitern:

; Erweitern der load-path für das speichern weiterer Plugins
;/home/maik/.emacs.d/el
(add-to-list 'load-path "~/.emacs.d/el/")

Ab dann werden alle in .emacs.d/el/ gespeicherten Module eingelesen.

nach oben

sr-speedbar.el einlesen

Damit sr-speedbar auch eingelesen wird, muss außerdem folgendes in der .emacs-Datei ergänzt werden:

; Terminal Speedbar:
(require 'sr-speedbar)

nach oben

Anpassungen

M-x customize-group RET sr-speedbar RET

Variablen

Variable Zweck
sr-speedbar-width-x Breite des Fensters unter X
sr-speedbar-width-console Breite des Fensters in einer Konsole
sr-speedbar-max-width Maximale Fensterbreite
sr-speedbar-delete-windows Sollen andere Fenster vor der anzeige gelöscht werden
sr-speedbar-skip-other-window-p Beim Fensterwechsel das Speedbarfenster auslassen
sr-speedbar-auto-refresh Status der Aktualisierung des Speedbarinhalts

nach oben

Nutzung

Befehl Zweck
sr-speedbar-open öffnet ein sr-speedbar-Fenster
sr-speedbar-close schließt ein sr-speedbar-Fenster
sr-speedbar-toggle Wechselt die Anzeige des sr-speedbar-Fensters
sr-speedbar-select-window Wechselt ind das sr-speedbar-Fenster
sr-speedbar-refresh-turn-on schaltet die Aktualisierung an
sr-speedbar-refresh-turn-off schaltet die Aktualisierung aus
sr-speedbar-refresh-toggle Wechselt die Aktualisierung |

nach oben

Probleme und Lösungen

Es werden in der Konsole nicht alle Funktionen angezeigt:

Wird ein Funktionsname derzeit zu lang, werden alle darauf folgenden Funktionen in der Konsole nicht mehr angezeigt, im Grafikmodus allerdings schon. Wenn ich die max-width auf 100 Setze tritt das Problem nicht mehr auf. Tatsächlich hat dies nichts mit der Weite zu tun. Statt dessen wird die Liste stark durch Änderungen an den Funktionsnamen beeinflusst. Dies ist allein in der Consolenversion zu beobachten und lässt auf einen Feheler schließen.

nach oben

Die Speedbar aktualisiert sich nicht von selber

Der angezeigte Buffer der Speedbar passt sich einer Namensänderung einer Funktion nicht automatisch an. Schließe ich den Buffer per C-x k und öffne danach erneut die Speedbar, wird diese korrekt angezeigt. Wie bereits oben beschrieben ist die Änderung der Funktionsnamen mit Problemen bei der Anzeige der Speedbar verbunden.

nach oben

Aktuelle Zeile hervorheben

Es gibt die Möglichkeit die aktuelle Zeile in Emacs hervorzuheben: Dazu kann unter Debian das Paket emacs-goodies-el installiert werden. In diesem Paket sind zahlreiche weitere Erweiterungen. Näheres durch apt-cache show emacs-goodies-el In der .emacs-Datei habe ich folgende Konfiguration

; Aktuelle Zeile hervorheben
; hierfür habe ich das Paket emacs-goodies-el unter Debian installiert
(highlight-current-line-on t)
(highlight-current-line-whole-line-on t)
(highlight-current-line-set-fg-color "white")
(highlight-current-line-set-bg-color "purple")

nach oben

Ein- und Ausblenden von Code-Blöcken

Vorwort

Bislang verwende ich geany zum schreiben von code. Ich möchte mehr und mehr dazu übergehen, Code mit dem emacs zu schreiben. Mit geany ist es möglich Code-Blöcke ein- und auszublenden. Dies ist sehr praktisch, da es Übersicht schafft und einen gleichzeitig ermöglicht, sich auf das Wesentliche zu konzentrieren.

Ein- und Ausblenden mit dem emacs

Das Ein- und Ausblenden beherrscht der Emacs in meiner Installation von Hause aus.

nach oben

Übersicht aller Funktionen

Ohne irgendwelche besonderen Modies zu starten ist es durch direkte Nutzung folgender Tastenkürzel möglich den Inhalt aller Funktionen auszublenden:

M-1 C-x $
Ausblenden aller Funktionsblöcke
C-u 1 C-x $
Alternative (1 oder eben 2,4,8 entspricht der

Spalte zum Ausblenden)

C-x $
Wiedereinblenden aller Funktionsblöcke

etwas handlicher

(defun jao-toggle-selective-display ()
  (interactive)
  (set-selective-display (if selective-display nil 1)))

(global-set-key [f1] 'jao-toggle-selective-display)

das ganze in belibiger Tiefe:

;F1-Taste zum Ausblenden
(defun jao-selective-display ()
"Activate selective display based on the column at point"
(interactive)
(set-selective-display
(if selective-display
nil
(+ 1 (current-indentation)))))
(global-set-key [f1] 'jao-selective-display)

nach oben

hs-minor-mode

Dazu muss nur der entsprechnde Minior-Mode, der die Funktionalität bereitstellt gestartet werden. Dies erreicht mann mit:

M-x hs-minor-mode

In diesem Mode kann nun die Sichtbarkeit der Code-Blöcke mit folgenden Tastenkürzeln beeinflusst werden:

nach oben

Tastenkürzel im hs-minor-mode

C-c @ C-h
Hide the current block (hs-hide-block)
C-c @ C-s
Show the current block (hs-show-block)
C-c @ C-c
Either hide or show the current block

(hs-toggle-hiding)

C-c @ C-M-h
Hide all top-level blocks (hs-hide-all)
C-c @ C-M-s
Show all blocks in the buffer (hs-show-all)
C-c @ C-l
Hide all blocks n levels below this block

(hs-hide-level)

nach oben

python-mode-hook

Um das Ein- und Ausblenden von Code-Blöcken auf einfache Weise beim bearbeiten von Python-Code zu ermöglichen genügt es folgende Zeilen in der ~.emacs~-Datei zu ergänzen.

; im python-mode ein einfaches Ein- und Ausblenden von Code-Blöcken ermöglichen
(add-hook 'python-mode-hook
  (lambda()
    (local-set-key (kbd "C-c <right>") 'hs-show-block)
    (local-set-key (kbd "C-c <left>")  'hs-hide-block)
    (local-set-key (kbd "C-c <up>")    'hs-hide-all)
    (local-set-key (kbd "C-c <down>")  'hs-show-all)
    (local-set-key (kbd "C-c TAB")   'hs-toggle-hiding)
    (hs-minor-mode t)))

Somit wird sobald der python-mode gestertet wird automatisch der hs-minor-mode gestartet und durch Strg+C und die Kursor-Tasten kann mit:

links
ein Block ausgeblendet werden
rechts
ein Block wieder eingeblendet werden
hoch
alle Blöcke ausgeblendet werden
runter
alle Blöcke eingeblendet werden
TAB
aktuellen Block ein- und ausblenden

nach oben

Problem

Leider lassen sich auf diese Weise nur ganze Funktionen Ein- und Ausblenden. Es wäre aber durchaus interessant auch Blöcke von Verzweigungen und Schleifen oder Kommentarblöcke sowie Datenblöcke Ein und Auszublenden.

nach oben

Alternativen

yafolding.el
Ausblenden aufgrund der Einrückung
fold-dwim
Erweiterung des hs-minor-mode
hideshowvis.el
noch anzusehen
CEDET
noch anzusehen (`global-semantic-tag-folding-mode')
outline-minor-mode
Ausblenden von Überschriften

nach oben

Änderungsverfolgung

Es ist möglich, sich alle Änderungen anzeigen zu lassen, die man am aktuellen Dokument vorgenommen hat. Dazu startet man den highlight-changes-mode.

nach oben

python

Speziell für Python habe ich die Einrücktiefe auf 2 Space geändert. Außerdem gibt es mit rope eine Bibliothek für Python, die spezielle Funktionen für diese Programmiersprache bereitstellt, die das Programmieren in Pythen deutlich angenehmer gestalten:

Tabweite

Die Tabweite ist auf 4 Space voreingestellt. In anbetracht der Tatsache, dass ich gern große Schrift verwende, wird dadurch der Platz auf dem Bildschirm recht schnell knapp. Ich bevorzuge daher eine Tabweite von *2 Space*.

Lösung:

Ich habe die Tabweite für den python-mode durch folgenden Eintrag in der .emacs-Datei auf 2 abgeändert:

; Einstellen einer 2 Space Tab-Weite in Python
(custom-set-variables
 '(python-guess-indent nil)
 '(python-indent 2))

nach oben

Rope-Code-Refactoring

Rope ist eine Bibliothek die sich auf einfache Weise in unterschiedlichste Entwicklungsumgebungen einbinden läst. Diese Bibliothek stellt dann Funktionen wie Autovervollständigung und Dokumentationszugriffe bereit.

Installation

sudo apt-get install python-ropemacs

Dann folgenden Eintrag in der .emacs-Datei ergänzen:

; rope
(require 'pymacs)
(pymacs-load "ropemacs" "rope-")
(setq ropemacs-confirm-saving 'nil)

nach oben

Nutzung

rope-goto-definition

Tastenkombination: C-c g

M-x rope-goto-definition

Springt zu der Stelle im Code an der der Bezeichner unter dem Cursor definiert wird. Dabei wird eine Sprungmarke gesetzt, so dass man mit der Tastenkobination C-u C-SPC wieder an den Ausgangspunkt zurückspringen kann.

nach oben

rope-show-doc

Tastenkombination: C-c d

M-x rope-show-doc

Zeigt den Docstring der Function unter dem Cursor an. Der Docstring ist der Kommentar unter dem Funktionsnamen der von jeweils 3 einfachen Anführungszeichen umschlossen wird. Dabei ist zu beachten, dass der Docstring keine deutschen Sonderzeichen enthalten darf. Pflegt man bei seinen Funktionen jeweils vernünftig die Docstrings, ist es möglich über diese Function eine schnelle Übersicht zu erhalten:

  • welchen Zweck die Funktion hat
  • welche Parameter erwartet werden
  • welchen Rückgabewert man bekommt

nach oben

rope-find-occurrences

Tastenkombination C-c f

M-x rope-find-occurrences

Zeigt alle Stellen an an denen der Bezeichner unter dem Cursor im Code vorkommt. Durch ENTER über dem jeweiligen Suchergebnis, kann mann die Stelle im Code direkt anspringen.

nach oben

rope-rename

Tastenkombination: C-c r r

M-x rope-rename

Vergibt einen neuen Bezeichner für alle Vorkommen des Bezeichners unter dem Cursor.

nach oben

ShortCuts

häufigste

Key Command
M-/ rope-code-assist
M-? rope-lucky-assist
C-c g rope-goto-definition
C-c d rope-show-doc
C-c f rope-find-occurrences

nach oben

Alle

Key Command
C-x p o rope-open-project
C-x p k rope-closw-projekt
C-x p f rope-find-file
C-x p 4 f rope-find-file-other-window
C-x p u rope-undo
C-x p r rope-redo
C-x p c rope-project-config
C-x p n [mpfd] rope-create-(module/package/file/directory)
| rope-write-project
C-c r r rope-rename
C-c r l rope-extract-variable
C-c r m rope-extract-method
C-c r i rope-inline
C-c r v rope-move
C-c r x rope-restructure
C-c r u rope-use-function
C-c r f rope-introduce-factory
C-c r s rope-change-signature
C-c r 1 r rope-rename-current-module
C-c r 1 v rope-move-current-module
C-v r 1 p rope-module-to-package
C-c r o rope-organize-imports
C-c r n [vfcmp] rope-generate-(variable/function/class/module/package)
C-c r a / rope-code-assist
C-c r a g rope-goto-definition
C-c r a d rope-shoe-doc
C-c r a f rope-finde-occurrences
C-c r a ? rope-lucky-assist
C-c r a j rope-jump-to-global
C-c r a c rope-show-calltip
| rope-analyze-module
| rope-auto-import
| rope-generate-autoimport-cache

nach oben

Neben-Modies

:PROPERTIES: :ORDERED: t :END:

Was sind Nebenmodies?

Nebenmodies werden durch die eingabe M-x Mode-Name an und ausgeschaltet. Sie erfüllen in allen Hauptmodies den selben Zweck reagieren aber jeweils so, wie es in dem entsprechendem Hauptmodus sinnvoll ist.

nach oben

auto-fill-mode

Mit dem auto-fill-mode wird gewährleistet, das der Text nach einer bestimmten Anzahl von Zeichen umgebrochen also in der folgenden Zeile fortgesetzt wird. Die Anzahl der Zeilen kann mit >C-x f Anzahl< festgelegt werden. Wird er nachträglich eingeschaltet, kann durch M-q der Text entsprechend automatisch umformatiert werden.

nach oben

menu-bar-mode

display-time

Zeigt die Zeit in der Statusleiste an

nach oben

ido-Mode

Heute (<2014-03-18 Di>) habe ich etwas über den ido-mode gelesen. Dieser modus erlaubt es quasi on-the-fly meine Eingaben beim suchen von Dateien oder verschiedenen geöffneten Buffern zu verarbeiten. Dabei sucht er jeweils alle passenden Einträge, die meine Eingabe im Namen enthalten, also auch die, die nicht mit diesen Buchstaben beginnen. Das ermöglicht ein sehr schnelles und vor allem einfaches Navigieren.

Der ido-mode läst sich wie folgt leicht bei Bedarf starten:

M+x ido-mode

Da der Modus nicht stört, sondern stehts hilfreich ist, möchte ich diesen aber lieber dauerhaft aktiviert haben. Dazu ist der .emacs-Datei folgendes hinzuzufügen:

;ido-mode zum einfachen Navigieren zu Dateien und Buffern
(require 'ido)
(ido-mode t)

Bedienung

Wie gewohnt gelten die Tastenkombinationen: C-x C-f :: zum öffnen einer Datei C-x C-b :: zum wechseln in einen anderen Buffer

Öffnen einer Datei

Mit C-x C-f wird in gewohnter Weise die Dateiauswahl gestartet. Hier braucht man nun einfach nur ein paar Zeichen zu tippen und ido sucht direkt die passenden Einträge und listet diese auf. Mit den Pfeiltasten oder C-s für next und C-r für previous kann mann durch diese Ergebnisliste blättern und ein passendes Ergebnis mit ENTER übernehmen. Möchte man die Ergebnisliste weiter eingrenzen, so drückt man C-SPC und kann nun innerhalb der vorher gefundenen Ergebnisliste durch tippen des nächsten Suchbegriffs weiter filtern. Mit der Backspace-Taste kann mann zum übergeordneten Vewrzeichnis wechseln. *~/* wechselt zum Home- und *//* in das root-Verzeichnis. Um das Verhalten ohne ido temporär wieder zu erhalten drückt man C-f zum Datei finden oder C-d um in den Directory-Modus zu wechseln. Eine neue Datei kann mit C-j erstellt werden. Wechselt man in ein Verzeichnis mit ENTER, wird dieses in eine Historie aufgenommen. Durch diese Historie kann man mit M-p rückwärz oder mit M-n vorwärz blättern. M-s sucht die nachfolgende Eingabe innerhalb der Historie. Möchte man ein Verzeichnis nicht mehr in der Historie haben, kann man das aktuelle Verzeichnis mit M-k aus der Historie löschen.

nach oben

Macrosprache emacs-Lisp

Vorwort

Emacs ist im Grunde ein einfacher Texteditor. Was Ihn besonders macht ist, dass er eine Lisp-Laufzeitumgebung intigriert hat. Diese ermöglicht es den Editor beliebig zu erweitern und damit seine Funktionalität anzupassen. Dies wurde seit Beginn seiner Existenz auch zahlreich getan, so dass es verschiedenste Programme gibt, die innerhalb dieses Editors laufen und es ermöglichen, den Emacs für alles mögliche zu verwenden. Mir wird es in diesem Punkt zunächst darum gehen, mich mit der dahinter stehenden Programmiersprache zu beschäftigen, damit ich die Programme verstehen und ggf. später an meine Bedürfnisse anpassen kann.

Dazu werde ich folgende Anleitung Schritt für Schritt abarbeiten: Lisp-Tutorial (en)

nach oben